package com.boot.proofing.common.util;/**
 * @description
 * @autor xbwu on 2018/7/2.
 */

import com.boot.proofing.common.config.BaseConstant;
import com.boot.proofing.common.config.WebSecurityConfig;
import com.boot.proofing.mpweb.base.entity.User;
import com.gitee.sunchenbin.mybatis.actable.utils.ClassTools;
import lombok.Cleanup;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.multipart.MultipartFile;

import java.io.*;
import java.util.Set;

/**
 * 文件工具类
 * @author xbwu
 * @create 2018-07-02
 **/
@Slf4j
public class FileUtil {

    /**
     * 用户个人文件存放处
     * @param ue
     * @return
     */
    public static String getUserFilePath(User ue){
        return new StringBuffer(BaseConstant.fileLocation)
        .append(File.separator)
        .append(WebSecurityConfig.USER)
        .append(File.separator)
        .append(ue.getId())
        .toString();
    }

    /**
     * 删除文件或者目录及其下所有文件
     * @param fileName
     * @return
     */
    public static void removeFile(String fileName){
        File file = new File(fileName);
        if (!file.exists()) {
            log.warn("删除文件或目录失败:{}不存在！",fileName);
        } else {
            if (file.isFile()){
                deleteFile(fileName);}
            else{
                deleteDirectory(fileName);}
        }
    }

    /**
     * 文件上传工具类服务方法
     * @param filePath 文件存放路径
     * @param fileName 文件名
     * @throws Exception
     */
    @SneakyThrows(IOException.class)
    public static void uploadFile(MultipartFile multipartFile, String filePath, String fileName){

        File targetFile = new File(filePath);
        if(!targetFile.exists()){
            targetFile.mkdirs();
        }
        @Cleanup
        FileInputStream fileInputStream = (FileInputStream) multipartFile.getInputStream();
        @Cleanup
        BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(filePath + File.separator + fileName));
        byte[] bs = new byte[1024];
        int len;
        while ((len = fileInputStream.read(bs)) != -1) {
            bos.write(bs, 0, len);
        }
        bos.flush();
    }


    /**
     * 删除单个文件
     *
     * @param fileName
     *            要删除的文件的文件名
     * @return 单个文件删除成功返回true，否则返回false
     */
    public static boolean deleteFile(String fileName) {
        File file = new File(fileName);
        // 如果文件路径所对应的文件存在，并且是一个文件，则直接删除
        if (file.exists() && file.isFile()) {
            if (file.delete()) {
                log.info("删除单个文件{} 成功！",fileName);
                return true;
            } else {
                log.info("删除单个文件{} 失败！",fileName);
                return false;
            }
        } else {
            log.info("删除单个文件失败{} 不存在！",fileName);
            return false;
        }
    }
    /**
     * 删除目录及目录下的文件
     *
     * @param dir
     *            要删除的目录的文件路径
     * @return 目录删除成功返回true，否则返回false
     */
    public static boolean deleteDirectory(String dir) {
        // 如果dir不以文件分隔符结尾，自动添加文件分隔符
        if (!dir.endsWith(File.separator)){
            dir = dir + File.separator;}
        File dirFile = new File(dir);
        // 如果dir对应的文件不存在，或者不是一个目录，则退出
        if ((!dirFile.exists()) || (!dirFile.isDirectory())) {
            log.info("删除目录失败：{} 不存在！",dir);
            return false;
        }
        boolean flag = true;
        // 删除文件夹中的所有文件包括子目录
        File[] files = dirFile.listFiles();
        for (int i = 0; i < files.length; i++) {
            // 删除子文件
            if (files[i].isFile()) {
                flag = deleteFile(files[i].getAbsolutePath());
                if (!flag){
                    break;
                }
            }
            // 删除子目录
            else if (files[i].isDirectory()) {
                flag = deleteDirectory(files[i]
                        .getAbsolutePath());
                if (!flag){
                    break;
                }
            }
        }
        if (!flag) {
            log.info("删除目录失败！");
            return false;
        }
        // 删除当前目录
        if (dirFile.delete()) {
            log.info("删除目录{} 成功！",dir);
            return true;
        } else {
            return false;
        }
    }

    public static void main(String[] args) {
        Set<Class<?>> classaa=ClassTools.getClasses("com.boot.proofing.mpweb");
        System.out.println(classaa);
    }
}
